Repository navigation
fix(text): KoPub 한자·전각 기호를 한글이 아닌 글꼴 자신의 전진폭으로 잰다 (#8099) - #8111
planet6897 wants to merge 3 commits into
Conversation
|
@planet6897 korpub 폰트는 웹폰트로 이미 cdn 에서 다운받아서 사용하는데 이 pr 이 과연 유용한가요? 현재 샘플 png 파일들도 전부 폰트가 깨져서 보이는데요? 현재 메인터너 보정으로 기존에 korpub 폰트 없을때 pdf 로 산출해서 회귀테스트 하는것도 다 제거증입니다. |
|
@jangster77 확인 감사합니다. 세 가지로 답드립니다.
|
KoPub돋움체·바탕체는 한자·전각 기호를 한글 전진폭(0.872 · 0.94)으로 쟀고, 「」『』·× 등은 KoPub 표 밖이라 공통 폴백으로 갔다. 글꼴(cmap+hmtx)은 한자·기호 900, 낫표 450 이고, 한/글 Print 내장 서브셋과 실제 전진이 같은 값을 증언한다. - 공통 갈래(KoPub·KoPubWorld): 한자 · 옛 자모(ㆍ 포함) · 전각 FF01–FF5E·FFE0–FFE6 · CJK 기호(、。〈〉《》「」『』【】〔〕 450, 〃〓 900) · is_fullwidth_symbol 900 · ◦ 600 · ₩ 894 · £¥ 계열별. - KoPub돋움체·바탕체는 U+0080–U+2FFF 를 글꼴 표(668자, 세 굵기 동일)로 잰다. 상자 그리기는 rhwp 의 PUA 글머리표 표시 대체(━ 등)가 생기는 블록이고 한/글은 그 글리프를 KoPub 으로 그리지 않아(정본 383쪽 중 0건) 표에서 뺐다.
288쪽은 한/글이 KoPub바탕 Light 를 두 크기(한글 13.92·14.40px)로 내고 rhwp 는 한 크기로 묶어, 쪽 한글 중앙값이 두 무리 경계에 걸렸다. devel 의 다른 변경으로 그 중앙값이 0.1px(14.1 → 14.0) 움직이자 「」 전진폭은 그대로(6.7–6.9px, 한/글과 같음)인데 비가 허용치를 넘었다. 같은 줄(run 의 y)·같은 글꼴·같은 크기의 한글 중앙값을 기준으로 바꾼다. 정본 비도 같은 PDF 에서 같은 기준으로 다시 쟀다 — 57쪽 × 만 0.8889 → 0.9638(글꼴 비 900/936 = 0.962, 쪽 기준은 다른 자간의 한글이 섞였다)이고 나머지 여섯 사례는 쪽 기준과 같다. - 새 head: 일곱 사례 모두 허용치 안(288쪽 0.4786 vs 0.4778) - 수정 전(devel def947c, 이 검사 파일만 얹음): 38쪽 바탕 한자 1.0000 vs 0.9667 로 실패
84bdfc4 to
ef97704
Compare
기존 planet6897 PR #8111·#8141·#8152·#8157·#8159·#8163·#8170·#8176·#8185·#8193의 기능 commit 49개와 통합 보정을 반영합니다. 중복 종료된 #8130의 임시 2개 적용은 제거했으며 기능 적용 수에서 제외합니다. 메인터너 보정은 현재 셀 글줄·물리 프레임·선언 행 높이와 선택 span 정렬의 일관성, 공백·출력 경계 및 요청한 회귀 제외를 처리합니다. sample16 계열과 행정업무운영 편람 HWP/HWPX는 사용자 지시로 검토에서 제외했습니다. 검증 code head 673c1d5f7cdcb5573b793ba2d2abaaedd2602134의 전체 nextest는 11,481 PASS/0 FAIL/45 skip이며 필수 로컬 게이트 14개를 통과했습니다. Native/fresh WASM 각35조건·2,041쪽의 최저 raw 91.87422%/91.82753%,90% 미달·고정 devel 대비0.1%p 이상 하락은 없습니다. 실제 Native15/Canvas2D15/지원CanvasKit12와 초기화 JS/WASM 응답을 확인했습니다. Mac WASM은 no-opt 로컬 대체 빌드입니다. CI 보정은 편람 Gym 과제8건 제거에 따른 원장 기대 건수와 삭제된 case를 참조한 --print 대상 한 줄입니다. 제품 Rust·Studio source는 로컬 검증 head와 같습니다. 최종 PR head b1e93d8, 테스트 merge 41a30c3eeb6e50464b6806beeaa20dbaa23a77a8의 Full CI·CodeQL·Render Diff·Proptest·Adapter·Gym 검사가 모두 통과했습니다. Rust4 shard 합계11,288 PASS/0 FAIL/45 skip입니다. 원 PR별 검토 기록, 대응하는 review/overlay PNG·전쪽 TSV와 오늘할일을 포함합니다. 머지 후 사용자 지정 옵션2로 실제 CI·merge·후속 처리 기록을 보완합니다. 대표 #7445 전체 해결을 주장하지 않습니다. Refs #8099, #8105, #7687, #8156, #7874, #8169, #8167, #8172, #4599, #7445, #7765, #7881 Co-authored-by: Jaeuk Ryu <35355437+planet6897@users.noreply.github.com>
|
기여해 주셔서 감사합니다. 이 PR의 기능을 검토·체리픽 통합하여 PR #8228로 devel에 반영했습니다.
원 기여에서는 KoPub 한자·기호를 해당 글꼴의 전진폭으로 측정합니다. 원 기여와 통합 보정0a275bdb8b에서 cmap 지원 범위·누락 기호 공급자·원본 PUA 반각 폭을 구분했습니다. 원 PR의 편람 그림은 사용자 제외 범위이므로 제출 증적에서 사용하지 않습니다. 현재 온새미로 36쪽 그림은 남아 있는 원문자·∼ 검사만 입증하며 편람의 한자 전체 수용으로 확대하지 않습니다. 원 기여 기능과 메인터너의 통합 보정 범위는 위 개별 검토 문서의 적용 commit·소비 경로·실제 회귀 결과에 구분했습니다. 다른 PR의 문서나 제외한 sample16·편람을 이 PR의 개선 증거로 대신하지 않았습니다. 해당 원 PR의 전쪽 비교
전체 페이지 90% 미만·누락 0쪽입니다. 같은 조건의 고정 base 대비 0.1%p 이상 하락은 0쪽이며, 쪽수 개선은 본문 소유·순서 보존을 따로 확인했습니다. 실제 입력·PDF SHA-256과 증적 바이트. 이 원 PR에 대응하는 정식 회귀 1건의 실제 PASS는 개별 검토 기록에 기재했습니다. 직접 확인한 증적직접 판독: 첫 질문의 ㉠~㉤과 선택지 번호·다음 본문의 원점/줄바꿈을 대조했습니다. 미세한 자형·농도 차이는 남지만 기호 뒤 본문이 밀리는 차이는 보이지 않습니다. Visual Sweep 비교·병합 판정 방법과 공통 producer·해시·잔여 원장을 연결합니다. 일치율은 내용 픽셀 중심 자동 비교 보조값이며 사람 판독의 정확도나 완전한 픽셀 동일성을 뜻하지 않습니다. 이 원 PR은 별도 직접 merge가 아니라 통합 PR에 반영했으므로 종료하겠습니다. contributor의 원격 브랜치는 유지합니다. 관련 이슈 전체의 완료 여부는 개별 증거 범위로 별도 판단하며 이 PR 종료만으로 일괄 종료하지 않습니다. |




Closes #8099
무엇을 고쳤나
KoPub돋움체·바탕체의 한자·전각 기호를 rhwp 가 한글 전진폭(돋움 0.872 · 바탕 0.94)으로 쟀고, 「」『』·
×등은 KoPub 표 밖이라 공통 폴백으로 갔다. 글꼴과 한/글 Print 는 이 글자들을 한글과 다른 900/1000em(낫표 450)으로 전진시킨다. 한자·기호가 많은 줄에서 바탕은 넓게, 돋움은 좁게 잡혀 줄 안 배치가 한컴과 갈렸다.근거
① 글꼴
cmap+hmtx직독 — KOPUS 배포 KoPub·KoPubWorld 바탕·돋움 × Light·Medium·Bold 12개 프로그램:② 한/글 Print — 정본
pdf/2025 행정업무운영 편람(최종)-2020-kopub.pdf(Hwp 2020 11.0.0.9136, KoPub 서브셋 내장, 383쪽)의 글자 전진(원점 차이)을 같은 줄 한글 전진으로 나눈 비가 글꼴 비와 맞는다.×도 PDF 57쪽(문서 49쪽)(×)에서 ○·→ 와 같은 0.804em(장평·자간 포함)으로 놓인다.변경
text_measurement.rskopub_cjk_symbol_units: KoPub·KoPubWorld 공통 갈래 — 한자 · 옛 자모 · 전각 FF01–FF5E·FFE0–FFE6 · CJK 기호(450 / 〃〓 900) ·is_fullwidth_symbol900 · ◦·₩·£·¥ 개별값.※는 이 갈래로 옮겼다(값 0.9 그대로).text_measurement/kopub_symbol_advances.rs(생성 표): KoPub돋움체·바탕체의 U+0080–U+2FFF 전진폭 668자(세 굵기 동일).× ± ¶·그리스·키릴·수학 기호 등이 글꼴 값으로 잡힌다. 다른 규칙이 소유하는 글자(좁은 구두점··‧, 곡선 따옴표, 공백류, U+00A0·U+00AD)는 넣지 않았다.×559 등) 공통 갈래만 쓴다.map_pua_bullet_char: U+F080F →━등)로 생기고, 한/글은 그 PUA 글리프를 KoPub 이 아닌 기호 글꼴로 그린다(편람 PDF 140쪽 글머리표: Haansoft Batang 0.46em). 정본 383쪽 전체에서 KoPub 으로 그려진 상자 그리기 글자는 0건이다. 이 블록을 표에 넣었을 때 PDF 139·140·297쪽(글머리표━줄)이 1~3%p 떨어지는 것을 확인하고 뺐다.검증 (code head
fd28c3bd2, 증적 head84bdfc4bb, base devel5e2b9bfbf)회귀 검사
tests/cases/issue_8099_kopub_cjk_symbol_advance.rs편람 HWP 의 쪽(아래 쪽 번호는 모두 PDF 쪽)마다 KoPub 글자 전진을 같은 쪽·같은 글꼴·같은 크기 한글 전진의 중앙값으로 나눈 비(한자는 언어 슬롯이 달라 한글과 다른 run 이 된다)를 정본에서 같은 방법으로 잰 값과 ±0.015 로 대조한다. 절대 px 이 아니라 비라서 줄 위치와 무관하다.
×시험을 둔 채 src 만 되돌리면 첫 사례(38쪽 바탕 한자)부터 1.0070 으로 FAIL, 수정 후 PASS.
전쪽 Native / fresh WASM 2px 실루엣 — 편람 383쪽(정본 383쪽)
(×)줄은×가 ○·→ 와 같은 폭으로 잡힌다.측정:
visual_sweep.py --silhouette-only --dpi 96 --compat 2022, Native(native-skiaPNG 래스터)와 fresh WASM(scripts/wasm-pack-locked.sh로 같은 소스에서 새로 빌드,rhwp_bg.wasmsha2562fe597341ecb7c22…).RHWP_FONT_PATH앞에 KOPUS 배포 KoPub돋움체·바탕체 TTF(Light·Medium·Bold) 폴더를 넣어 devel·head 를 모두 다시 돌렸다(이전 판은 그 폴더를 경로에 넣지 않았다). Native 는 검증 기계의 사용자 글꼴(fontconfig)로 이미 같은 KoPub 을 쓰고 있어 결과가 같았고, fresh WASM 은 평균이 0.01 낮아졌다. 위 그림은 이 재실행의 산출물이다(head84bdfc4bb).코퍼스·게이트
samples/**1,252문서layout-anomalyA/B(devel 대비): 바뀐 문서 0.issue_6520_svg_layer_contract::subset_font_bytes_are_deterministic_for_multiple_codepoints는 검증 기계에 한컴돋움(HDOTUM.TTF)이 사용자 글꼴로 설치돼 있어 시험이 그 TTF 를 임베드하면서font/opentype확인에 실패한 환경 문제다(그 글꼴이 없는 CI·devel 에서는 통과, 이 PR 무관).🤖 Generated with Claude Code
최신 devel rebase (2026-10-23, #8173 절차)
upstream/develdef947c21, headef97704cf(이전84bdfc4bb). 위 이미지 URL 은 새 head 로 갱신했다(같은 파일).src/renderer/layout/kopub_symbol_metrics.rs, 한컴 2024 Print CIDFont /W, KoPub 돋움·바탕만)이 들어왔다.kopub_char_advance_em은 그 표를 먼저, 없으면 이 PR 의 표(kopub_cjk_symbol_units, KoPubWorld 포함)를 본다. 두 표에 함께 있는 글자는 값이 하나도 다르지 않음을 확인했다. devel 표에만 있는·‘’“”‧는 이 PR 이 다른 규칙 소유로 표에서 뺀 글자라 devel 값이 그대로 쓰인다.ef97704cf): rebase 뒤issue_8099_kopub_cjk_symbol_advance가 288쪽 바탕 「」 비 0.4929(정본 0.4778, 허용 0.015)로 실패했다. 「」 전진폭은 rebase 전후 같고(6.7–6.9px) 한/글 PDF(6.72·6.88px)와 같으며, 분모인 쪽 한글 중앙값이 devel 의 다른 변경으로 14.1 → 14.0px 움직인 탓이다. 한/글은 이 쪽을 두 크기(한글 13.92·14.40px)로, rhwp 는 한 크기로 묶어 쪽 중앙값이 두 무리 경계에 걸려 있었다. 기준을 같은 줄·글꼴·크기의 한글 중앙값으로 바꾸고 정본 비도 같은 PDF 에서 같은 기준으로 다시 쟀다(57쪽 × 만 0.8889 → 0.9638, 글꼴 비 900/936 = 0.962). 새 head 일곱 사례 모두 허용치 안(288쪽 0.4786), devel(이 검사 파일만 얹음)은 38쪽 바탕 한자 1.0000 으로 실패.--check· unit tier 통과, nextest 는 rebase 직후 11,477건 중 위 검사와issue_6520_svg_layer_contract::subset_font_bytes_are_deterministic_for_multiple_codepoints(이 host 의 시스템 한컴 글꼴 탓, base 동일, 무관) 2건 외 통과. 검사 수정 뒤 all-targets Clippy 와 해당 검사 재실행 통과.--compat 2022,RHWP_FONT_PATH앞에 KoPub돋움·바탕 TTF, 빌드 전 소스 touch·sha256 확인, base = develdef947c21+ 무관 커밋):